package com.meiqia.user.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.meiqia.common.asserts.Asserts;
import com.meiqia.common.constant.Constants;
import com.meiqia.common.util.CodecUtils;
import com.meiqia.user.entity.User;
import com.meiqia.user.mapper.UserMapper;
import com.meiqia.user.service.UserService;
import com.meiqia.user.struct.PageResult;
import com.meiqia.user.vo.SearchVO;
import com.meiqia.user.util.StringUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.util.Objects;
import java.util.List;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author lightman
 * @since 2020-12-08
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Override
    public PageResult<User> page(Integer currPage, Integer pageSize, SearchVO vo) {
        // 分页
        Page<User> userPage = new Page<>(currPage, pageSize);

        // 条件查询
        QueryWrapper<User> wrapper = new QueryWrapper<>();

        if (Objects.nonNull(vo)) {
            String keyWord = vo.getKeyWord();
            if (StringUtils.isNotEmpty(keyWord)) {
                wrapper.like("name", keyWord);
            }
        }
        userPage = page(userPage, wrapper);
        return PageResult.of(userPage.getRecords(), userPage.getTotal());
    }

    @Override
    public boolean saveUser(User user) {
        return save(user);
    }

    @Override
    public boolean updateUser(User user) {
        return updateById(user);
    }

    @Override
    public boolean delById(Long id) {
        return removeById(id);
    }

    @Override
    public boolean delByIds(List<Long> ids) {
        return removeByIds(ids);
    }

    // 注册
    @Override
    public boolean register(User user) {

        // 我们现在操作,是医生 还是患者. 断言用户角色不为空
        Asserts.isNotNull(user.getRole(), Constants.User.USER_ROLE_IS_NOT_EMPTY);

        // 注册的时候,先根据用户名进行查询,用户名唯一
        LambdaQueryWrapper<User> lambda = new QueryWrapper<User>().lambda();
        lambda.eq(User::getName, user.getName());
        // 因为用户名唯一我们可以用getOne来查询, 注册的账号在数据库中比对的结果
        User userForDB = getOne(lambda);
        // 我们断言这个结果在数据库中不存在
        Asserts.isNull(userForDB, Constants.User.USER_ALREADY_EXIST);

        User user1 = new User();

        // 因为我们这个查询到的userForDB为空,刚好是我们要的对象,我们用它来操作
        user1.setName(user.getName()); // 保存新的用户名
        user1.setSalt(CodecUtils.md5Hex(user.getName(), "")); // 加盐
        user1.setPassword(CodecUtils.md5Hex(user.getPassword(), user.getSalt())); // 按照指定的盐加密
        user1.setStatus(1); // 设置用户状态,1为正常,0为冻结
        user1.setRole(user.getRole()); // 设置用户的角色,前台传过来.


        // 保存信息并返回
        return save(user1);
    }

    // 根据登录的id 查询用户信息
    @Override
    public User getPatientOrDoctorById(Long id) {
        User user = getById(id);
        return user;
    }
}
